home *** CD-ROM | disk | FTP | other *** search
- unit IntfList;
- interface
- uses
- Classes;
- type
- IInterfaceList = interface['{BEC6B350-40CF-11D1-91D9-00C0DF119781}']
- // property implementation methods
- function GetCount: integer;
- function GetItem(Index: integer):IUnknown;
- procedure SetItem(Index: integer; const Value: IUnknown);
- // methods
- procedure Add(const Unknown: IUnknown);
- procedure Clear;
- procedure Delete(Index: integer);
- procedure Exchange(Index1,Index2: integer);
- function IndexOf(const Unknown: IUnknown): integer;
- procedure Insert(Index: integer; const Unknown: IUnknown);
- procedure Move(CurIndex,NewIndex: integer);
- procedure Pack;
- procedure Remove(const Unknown: IUnknown);
- // properties
- property Count: integer read GetCount;
- property Items[Index: integer]: IUnknown read GetItem write SetItem; default;
- end;
- TInterfaceList = class(TInterfacedObject,IInterfaceList)
- private
- fItems: TList;
- protected
- function GetCount: integer; virtual;
- function GetItem(Index: integer): IUnknown; virtual;
- procedure SetItem(Index: integer; const Value: IUnknown); virtual;
- public
- constructor Create;
- destructor Destroy; override;
- procedure Add(const Unknown: IUnknown);
- procedure Clear;
- procedure Delete(Index: integer);
- procedure Exchange(Index1,Index2: integer);
- function IndexOf(const Unknown: IUnknown): integer;
- procedure Insert(Index: integer; const Unknown: IUnknown);
- procedure Move(CurIndex,NewIndex: integer);
- procedure Pack;
- procedure Remove(const Unknown: IUnknown);
- property Count: integer read GetCount;
- property Items[Index: integer]: IUnknown read GetItem write SetItem; default;
- end;
-
- implementation
- constructor TInterfaceList.Create;
- begin
- inherited Create;
- FItems:= TList.Create;
- end;
-
- destructor TInterfaceList.Destroy;
- begin
- Clear;
- FItems.Free;
- inherited Destroy;
- end;
-
- function TInterfaceList.GetCount: integer;
- begin
- Result:= FItems.Count;
- end;
-
- function TInterfaceList.GetItem(Index: integer): IUnknown;
- begin
- Result:= IUnknown(FItems[Index]);
- end;
-
- procedure TInterfaceList.SetItem(Index: integer; const Value: IUnknown);
- var
- Unknown: IUnknown;
- begin
- Unknown:= IUnknown(FItems[Index]);
- if Assigned(Unknown) then Unknown._Release;
- FItems[Index]:= pointer(Value);
- if Assigned(Value) then Value._AddRef;
- end;
-
- procedure TInterfaceList.Add(const Unknown: IUnknown);
- begin
- FItems.Add(pointer(Unknown));
- if Assigned(Unknown) then Unknown._AddRef;
- end;
-
- procedure TInterfaceList.Insert(Index: integer; const Unknown: IUnknown);
- begin
- FItems.Insert(Index,pointer(Unknown));
- if Assigned(Unknown) then Unknown._AddRef;
- end;
-
- procedure TInterfaceList.Delete(Index: integer);
- var Unknown: IUnknown;
- begin
- Unknown:= IUnknown(FItems[Index]);
- if Assigned(Unknown) then Unknown._Release;
- FItems.Delete(Index);
- end;
-
- function TInterfaceList.IndexOf(const Unknown: IUnknown): integer;
- begin
- Result:= FItems.IndexOf(pointer(Unknown));
- end;
-
- procedure TInterfaceList.Move(CurIndex,NewIndex: integer);
- begin
- FItems.Move(CurIndex,NewIndex);
- end;
-
- procedure TInterfaceList.Pack;
- begin
- FItems.Pack;
- end;
-
- procedure TInterfaceList.Remove(const Unknown: IUnknown);
- var
- Index: integer;
- begin
- Index:= FItems.IndexOf(pointer(Unknown));
- if Index >= 0 then Delete(Index);
- end;
-
- procedure TInterfaceList.Clear;
- var
- ix: integer;
- Item: pointer;
- begin
- for ix := FItems.Count-1 downto 0 do begin
- Item:= FItems[ix];
- if Assigned(Item) then IUnknown(Item)._Release;
- end;
- FItems.Clear;
- end;
-
- procedure TInterfaceList.Exchange(Index1,Index2: integer);
- begin
- FItems.Exchange(Index1,Index2);
- end;
- end.
-